QMT 与 PTrade · 券商量化交易终端梳理

境内 A 股程序化交易两大主流券商终端 —— 行为、结构、API 能力与选型对比

阅读指南:本文梳理国内个人 / 机构做 A 股程序化交易时最常见的两个券商终端 —— QMT(迅投)与 PTrade(恒生电子)。§1 讲清二者的出身与根本差异;§2 行为视图先回答"系统做什么";§3 结构视图再回答"由什么组成";§4–§5 横向对比并说明申请门槛;§6 专门回答"超级量化这类第三方产品如何对接 QMT / PTrade";§7–§9 是选型、实操手册与速查表。

0. 一句话结论

QMT 是"本地客户端 + Python 库"的可编程交易终端,PTrade 是"跑在券商机房的托管式策略平台"。功能覆盖高度重合(A 股股票 / 两融 / ETF / 期货 / 期权、回测、实盘),真正的分野在运行位置:QMT 策略跑在你自己的电脑或云服务器上,自由度高、可用任意三方库,但依赖本地机器与网络;PTrade 策略托管在券商机房,无人值守、稳定低延迟,但内网隔离、只能用它内置的库,且编辑环境锁定 Windows。二者都是券商采购后免费(或按资金门槛)提供给客户的工具,没有绝对优劣,只看你的开发习惯与部署诉求。

1. 平台背景与定位

1.1 两个平台分别是什么

维度QMT 迅投 MiniQMT / 极速交易终端PTrade 恒生电子
开发厂商上海迅投信息科技(ThinkTrader / 迅投)恒生电子(Hundsun)
产品形态桌面交易终端(QMT 客户端)+ xtquant Python 库桌面客户端 + 策略运行引擎,策略托管在券商机房
获取方式券商开户后申请开通,下载客户端 + xtquant 库券商采购后向客户提供,按营业部 / 券商申请权限
策略运行位置用户本地 PC / 自购云服务器券商机房服务器(托管)
编程方式自由 Python 程序,主动调用 API + 注册回调固定事件驱动框架(initialize / handle_data)
典型券商国金、国盛、华鑫、东方财富等多家国金、国盛、湘财、东莞、长江、山西、申万宏源、国泰君安-海通等
专有名词:QMT(Quick Trading) —— 迅投推出的量化交易终端品牌。面向量化用户的是它的 MiniQMT(极速交易终端),只保留行情与交易内核,把可编程接口以 Python 库 xtquant 形式对外提供,因此常被简称"QMT"。
专有名词:PTrade —— 恒生电子开发、由券商采购后提供给客户的量化交易平台。用户在其客户端里编写 Python 策略,策略托管运行在券商机房,不必自备服务器,属于"托管式"量化终端。
专有名词:券商柜台(Broker Counter) —— 券商内部负责接收报单、验资验券、向交易所转报并回报成交的后台系统。QMT / PTrade 都只是"前端",真正的下单、风控、清算仍在柜台与交易所完成。

1.2 最本质的差异:运行位置

把两个平台放在同一张图上看,全部差异几乎都能从"策略代码到底跑在哪台机器上"这个原点推导出来:

2. 行为视图(系统做什么)

先看"做什么":从整体用例,到策略全生命周期,再分别拆解两个平台一次下单的完整链路,最后收束到委托单的状态流转。

2.1 用例图 · 量化终端整体行为

PlantUML diagram
图 1 用例图(行为 · 整体):量化投资者、券商与交易所围绕量化终端的核心用例

两个平台对投资者呈现的用例几乎一致:编写调试、历史回测、仿真交易、实盘自动交易、行情获取、账户查询、风控、监控。区别在于用例的执行方与承载位置——QMT 的"策略编写 / 回测 / 实盘"发生在本地,PTrade 的则发生在券商机房内。

专有名词:用例(Use Case) —— UML 行为图之一,描述"系统为参与者提供哪些有价值的服务",只回答做什么、不回答怎么做。

2.2 活动图 · 策略全生命周期

PlantUML diagram
图 2 活动图(行为 · 主流程):从研究编写到实盘运行的策略生命周期,含回测 / 仿真两道闸门

无论用 QMT 还是 PTrade,量化策略的落地路径是同一条:研究 → 回测 → 仿真 → 实盘 → 监控迭代。两个平台在"仿真"这一步的实现方式不同:QMT 常以模拟账号 / 模拟柜台完成,PTrade 有独立的仿真交易环境。回测与仿真未达标就实盘,是量化最常见的亏损来源。

专有名词:回测(Backtest) —— 在历史行情上按策略规则模拟撮合,检验策略历史表现。回测会受滑点、成交量限制、前视偏差影响,与实盘常有差距。
专有名词:仿真 / 模拟盘(Paper Trading) —— 用实时行情驱动策略、但不真正成交的下单演练,用于检验工程链路与执行逻辑,比回测更接近实盘。

2.3 时序图 · QMT 实盘下单链路

PlantUML diagram
图 3 时序图(行为 · 细化):QMT 中一次报单从策略进程到交易所的往返

QMT 的链路是"策略进程 → xtquant → MiniQMT 客户端 → 券商柜台 → 交易所"。策略侧既可用同步接口 order_stock(返回订单号),也可用异步接口 order_stock_async(返回请求序号),成交与状态变化通过注册的回调类主推回策略。下面是最小可运行的连接 + 下单示例:

QMT · 连接、下单与回调(Python / xtquant)
from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
from xtquant.xttype import StockAccount
from xtquant import xtconstant

class MyCallback(XtQuantTraderCallback):
    def on_stock_order(self, order):
        print("委托回报:", order.stock_code, order.order_status)
    def on_stock_trade(self, trade):
        print("成交回报:", trade.stock_code, trade.traded_volume, trade.traded_price)
    def on_order_error(self, err):
        print("下单失败:", err.order_id, err.error_msg)

path = r"D:\迅投极速交易终端\userdata_mini"   # MiniQMT 的 userdata_mini 目录
trader = XtQuantTrader(path, session_id=123456)
acc = StockAccount("1000000365")               # 资金账号
trader.register_callback(MyCallback())
trader.start()
trader.connect()                               # 返回 0 表示连接成功
trader.subscribe(acc)                          # 订阅交易主推

# 同步报单:指定价买入 600000.SH 200 股
order_id = trader.order_stock(
    acc, "600000.SH", xtconstant.STOCK_BUY, 200,
    xtconstant.FIX_PRICE, 10.5, "my_strategy", "remark")

trader.run_forever()                           # 阻塞线程,持续接收主推

行情侧由 xtdata 模块独立提供,可取历史与实时行情、分笔、财务、板块数据:

QMT · 下载并读取历史行情(XtData)
from xtquant import xtdata

# 先下载再读取,避免实时拉取阻塞
xtdata.download_history_data("600000.SH", "1d", "20240101", "20241231")
bars = xtdata.get_market_data_ex([], ["600000.SH"], period="1d")
print(bars["600000.SH"].tail())
专有名词:主推(Push / Callback) —— 与"客户端主动查询"相对,指服务端在委托、成交、持仓变化时主动把事件推送给策略的回调函数(如 on_stock_order),免去轮询。
专有名词:session_id(会话编号) —— QMT 中每个 Python 策略需使用不同的会话编号,用于区分同一台机器上并行的多个策略进程。

2.4 时序图 · PTrade 实盘下单链路

PlantUML diagram
图 4 时序图(行为 · 细化):PTrade 托管策略由引擎按事件周期驱动下单

PTrade 没有"策略进程"这一显式概念,取而代之的是引擎按周期调用你写好的事件函数:initialize(启动一次)→ 每个交易日 before_trading_start → 盘中反复 handle_data / tick_data → after_trading_end。你在这些函数里调用 order 系列接口下单,成交回报通过 on_order_response / on_trade_response 回吐。

PTrade · 一个完整的最小策略(事件驱动)
def initialize(context):
    g.security = "600570.SS"      # 恒生电子
    set_universe(g.security)      # 设置股票池,只能操作池内标的

def before_trading_start(context, data):
    log.info("盘前准备:%s" % g.security)

def handle_data(context, data):
    price = data[g.security]["close"]          # 当前周期收盘价
    if price > 20:
        order_target_value(g.security, 10000)  # 调整到目标市值买入

def after_trading_end(context, data):
    log.info("盘后结算")
PTrade · 常用下单函数
order("600570.SS", 1000)                 # 按数量买入(负数为卖出)
order_target("600570.SS", 0)             # 调整到目标持仓数量(0 = 清仓)
order_value("600570.SS", 10000)          # 按金额买入
order_target_value("600570.SS", 50000)   # 调整到目标持仓市值
order_market("600570.SS", 1000, 0)       # 市价委托(第三参为市价类型)
专有名词:事件驱动(Event-driven) —— 策略不是自己写主循环,而是把逻辑拆进若干由引擎在特定时点回调的函数中。PTrade 的 handle_data、tick_data 都是事件入口。
专有名词:持久化(Persistence) —— 托管策略在券商升级或环境重启后需要恢复状态,PTrade 会用 pickle 自动保存全局对象 g 中可序列化的变量(以 __ 开头的私有变量不保存)。
专有名词:tick / 3 秒级 —— PTrade 交易环境最小运行粒度为 3 秒一次(tick 级),回测支持日线与分钟级;QMT 的 xtdata 亦提供分笔(tick)级数据。

2.5 状态机图 · 委托单状态流转

PlantUML diagram
图 5 状态机图(行为 · 细化):一张委托单从报送到终态的状态流转(对应 QMT order_status)

两个平台都维护一张委托单的生命周期状态。QMT 用 xtconstant.ORDER_* 常量表达,PTrade 用订单对象的 status 字段表达,语义基本一一对应。理解状态机是处理"撤单失败 / 部成待撤"等边界条件的前提。

专有名词:废单(Rejected Order) —— 报单被柜台校验拒绝(价格越界、资金 / 证券不足、非交易时段等),进入终态,无法再撤。QMT 报 ORDER_JUNK,PTrade 订单状态为"废单 / 已拒绝"。
专有名词:部成待撤 / 部撤 —— 委托部分成交后申请撤单的中间态与终态。撤单只对未成交部分有效,已成交部分不可撤销。

3. 结构视图(由什么组成)

再看"由什么组成":从宏观部署,到各自的组件,到 Python 包与 API 分类,最后落到核心对象类图。

3.1 部署图 · 本地 vs 托管

PlantUML diagram
图 6 部署图(结构 · 宏观):QMT 本地部署 与 PTrade 机房托管的节点与连接

部署差异决定了一切运维特性:QMT 的策略与数据都在本地节点,机器关机 / 断网即策略中断;PTrade 的策略与行情都在券商机房,处于内网,天然获得更稳定的网络与更低的柜台穿透延时。

专有名词:部署图(Deployment Diagram) —— UML 结构图之一,描述软件组件运行在哪些物理 / 逻辑节点(node)上,以及节点之间的连接。
专有名词:穿透延时(Order Latency) —— 从策略发出报单到柜台受理的时间。托管在机房内网通常比本地家庭宽带更快、更稳定。

3.2 组件图

PlantUML diagram
图 7 组件图(结构 · QMT):xtquant 库、MiniQMT 客户端与券商柜台 / 行情服务
PlantUML diagram
图 8 组件图(结构 · PTrade):终端内的策略引擎、回测 / 仿真、量化工具与券商侧行情 / 柜台

两者都由"策略层 + 引擎层 + 券商侧"三段构成。QMT 的引擎层是本地独立的 MiniQMT 客户端;PTrade 的引擎层与券商侧同处机房,边界更模糊。

专有名词:组件图(Component Diagram) —— UML 结构图之一,描述系统由哪些可替换的组件构成,以及组件之间通过接口的依赖关系。
专有名词:量化工具(内置策略工具) —— PTrade 除 Python 编程外,还提供网格交易、ETF 趋势、盘口扫单、追涨停、可转债套利等"点鼠标即可运行"的预置策略。

3.3 包图 · Python 包结构

PlantUML diagram
图 9 包图(结构 · QMT):xtquant 的行情、交易、类型、常量四个子包
PlantUML diagram
图 10 包图(结构 · PTrade):策略 API 按设置、行情、交易、对象、计算工具分组

QMT 以 Python 库形式暴露 API,导入路径清晰(xtquant.xtdata / xtquant.xttrader 等);PTrade 的 API 不是"导入的库",而是预置在策略运行环境里的全局函数,按功能分组,直接调用即可。

3.4 类图 · 核心对象

PlantUML diagram
图 11 类图(结构 · QMT):XtQuantTrader、回调类与资产 / 委托 / 成交 / 持仓对象
PlantUML diagram
图 12 类图(结构 · PTrade):Context / Portfolio / Position / Order 等上下文对象

QMT 是"交易器 + 数据结构"范式:XtQuantTrader 提供方法,查询 / 下单返回 XtAsset / XtOrder / XtTrade / XtPosition 等对象,通过 XtQuantTraderCallback 接收推送。PTrade 是"上下文 + 全局函数"范式:所有函数在事件函数中直接调用,账户与持仓信息封装在 context(context.portfolio)里,跨事件的状态放在全局对象 g。

专有名词:Context(上下文对象) —— PTrade 在每个事件函数中传入的账户快照,context.portfolio 提供现金、总资产、持仓字典等,是策略读取账户状态的入口。
专有名词:g(全局对象) —— PTrade 策略内跨事件函数共享数据的全局命名空间,如 g.security;可序列化的内容会被框架持久化。

4. 能力横向对比

4.1 运行模式与部署

维度QMTPTrade
策略运行位置本地 PC / 自购云服务器券商机房(托管)
无人值守需本机常开、网络稳定;可自购云主机原生支持,客户端关闭后策略仍在机房运行
编辑环境本机 Python 环境,任意 OSWindows 客户端(macOS / Linux 需装虚拟机)
网络隔离可用公网、接任意数据源内网隔离,通常不能上网

4.2 编程模型

维度QMTPTrade
范式自由 Python 程序,主动调用 API + 注册回调固定事件驱动框架,必须实现 initialize + handle_data
事件入口自行组织主循环;on_stock_order 等回调before_trading_start / handle_data / tick_data / after_trading_end / run_daily
三方库可自由 pip 安装仅限内置库,不能 pip(部分券商可 HTTP 连外网)
Python 版本库区分 3.6–3.12,按环境自动切换多数券商内置 3.5,部分(如国金)已到 3.11

4.3 行情能力

维度QMTPTrade
粒度历史 / 实时 K 线、分笔(tick)、财务、板块行业日线 / 分钟 / tick,tick 最小 3 秒
盘口档位全推 + 分笔,视券商权限默认可取十档,部分券商内置 L2 逐笔(免费)
取数方式xtdata:download_history_data / get_market_data_exget_history / get_price / get_snapshot / get_gear_price

4.4 交易品种与业务

品种 / 业务QMTPTrade
A 股股票支持支持(沪深主板 / 创业板 / 科创板)
可转债(T+0)支持支持
ETF / LOF支持,含申赎支持,含 ETF 申赎 / 套利
融资融券支持(含专项、约券)支持(统一的 margin_* 接口)
期货支持(六键 / 四键 / 两键、套利、展期)支持(投机类型交易)
期权支持股票 / 期货期权、行权回测支持面较窄,交易以券商权限为准
国债逆回购支持支持
港股通支持(沪 / 深港通账号类型)部分支持

4.5 稳定性与适用人群

维度QMTPTrade
稳定性 / 速度取决于本地机器与网络;自备云主机可改善机房托管,稳定性与穿透速度通常更优
适合人群有开发环境、需自由用三方库、要深度定制 / 调试者想省去服务器运维、要做无人值守、以 A 股 / 可转债为主者
主要短板机器常开、断网即停;需自行运维内网封闭、库受限、编辑环境锁 Windows

5. 申请门槛与开通流程

QMT 与 PTrade 都不是"下载即用"的公开软件,而是"券商采购 → 提供给开户客户"的通道型产品。能否开通取决于三件事:你开户的券商、你的账户资产、以及程序化交易报备是否合规。

5.1 开通条件构成

条件类型说明常见档位
资产门槛(核心变量)部分券商要求账户日均资产达标才授予权限0(免费)/ 30 万 / 50 万 / 100 万,各券商差异极大
风险测评须评估为积极型C4(积极型)及以上
交易 / 佣金约定部分券商以"佣金率 / 交易量"作为交换条件协商,常与资产门槛二选一
程序化交易报备依法须事先向交易所报备账户、策略与速率由券商协助办理(见 5.3)
账户权限普通账户即可;两融 / 期货 / 期权需先单独开通—

5.2 两个平台的申请差异

维度QMTPTrade
开通主体券商向迅投采购版本,再按客户开通券商向恒生采购版本,再按客户开通
常见资产门槛较灵活,部分券商可低门槛 / 免费试用通常偏高,常见 50 万起,部分券商提供测试账号
开通耗时一般 1–3 个工作日(视报备与审核)一般 1–3 个工作日
所需材料身份证、银行卡、风险测评、程序化交易承诺 / 报备表同上
测试环境部分券商提供模拟账号 / 测试客户端部分券商提供测试账号 / 测试客户端(如国金)

5.3 程序化交易报备(2024 起的新增门槛)

自 2024 年《证券市场程序化交易管理规定(试行)》及沪深北交易所配套细则施行后,程序化交易投资者须事先报备,内容包括账户信息、交易策略类型、最高申报速率、单日最高申报笔数等;达到高频标准的还需额外报告并可能被加收费用。开通 QMT / PTrade 时券商一般会一并协助完成报备,未报备即程序化下单可能被限制交易或处罚。

专有名词:程序化交易报备 —— 投资者从事程序化交易前,须通过券商向证券交易所报告账户、策略、速率等信息。这是 QMT / PTrade 开通的事实前置条件,也是监管识别异常交易的基础。
专有名词:高频交易(HFT)认定 —— 交易所按"每秒申报 / 撤单笔数、单日申报 / 撤单笔数"等指标认定高频交易,认定后报告义务与成本更高;普通中低频策略一般不会触发。
结论:门槛的真正变量是券商而非平台本身——同一平台在不同券商的门槛可能从"免费"到"100 万"不等。落地时先锁定券商与营业部,问清"资产门槛 + 佣金 + 报备"三项,再决定用 QMT 还是 PTrade。

6. 超级量化如何对接 QMT / PTrade

先给结论:QMT 有交易 API——迅投的 Python 库 xtquant(XtData 行情 + XtTrader 交易);但它是本地 SDK,只能与本机登录的 MiniQMT 客户端通信,不是公网 REST / WebSocket 交易接口。PTrade 没有对外交易 API——它的 API 是运行在券商机房策略环境内的全局函数,外部进程无法调用。因此超级量化有两条对接路径:QMT 走"用户本机执行器调用 xtquant",PTrade 走"生成策略代码由用户导入运行"。

6.1 有没有交易 API:一张表说清

能力QMTPTrade
行情数据 API有,xtquant.xtdata(本地库)有,但仅在策略环境内(get_history 等)
交易下单 API有,xtquant.xttrader(本地库)有,但仅在策略环境内(order 等)
接口形态Python SDK,本机进程间通信机房内策略函数,无对外网络接口
能否被第三方产品远程调用不能远程;须部署在用户本机、与 MiniQMT 同机不能;只能由 PTrade 引擎运行你的代码
可行的对接方式自研执行器 import xtquant 下单生成 PTrade 兼容策略代码,用户粘贴运行

一句话:两者都不是"注册个 API key 就能远程下单"的开放接口。这是券商场的普遍特点——账户与执行必须落在用户自己已开通权限的终端里。也正因如此,"用户自持账户自跑"的工具定位天然成立、合规风险最低。

6.2 QMT 对接方案(推荐,可做到自动化)

QMT 是唯一能让超级量化程序化对接执行的通道。做法是把超级量化的"执行端 / 网关"部署到用户本机(或用户自购云主机),它 import xtquant,与用户已登录的 MiniQMT 客户端通信完成下单与回报。信号可由云端下发,执行器轮询后转为本地报单。

超级量化 · QMT 执行器最小骨架
from xtquant.xttrader import XtQuantTrader, XtQuantTraderCallback
from xtquant.xttype import StockAccount
from xtquant import xtconstant
import requests  # 从超级量化云端拉取信号

class Gateway(XtQuantTraderCallback):
    def on_stock_trade(self, trade):
        report("trade", trade.stock_code, trade.traded_volume, trade.traded_price)

trader = XtQuantTrader(r"D:\...\userdata_mini", session_id=1001)
acc = StockAccount("1000000365")
trader.register_callback(Gateway())
trader.start(); trader.connect(); trader.subscribe(acc)

# 轮询超级量化云端信号 → 转成本地下单
for sig in requests.get("https://sq.example.com/api/signals",
                        params={"token": TOKEN}).json():
    if sig["action"] == "buy":
        trader.order_stock(acc, sig["code"], xtconstant.STOCK_BUY,
                           sig["volume"], xtconstant.FIX_PRICE, sig["price"],
                           "superquant", sig["id"])

trader.run_forever()
专有名词:执行器 / 网关(Executor / Gateway) —— 超级量化对外的本地组件,负责"云端信号 → 本机 QMT 下单 → 回报回传"。它只做指令搬运,不接触用户资金、不代客操作,是"工具"定位的关键边界。
部署前提(必须满足):
  • 同机——超级量化执行端、xtquant、MiniQMT 客户端必须在同一台机器上;xtquant 走本地进程间通信,不能跨机 / 远程调用。
  • 客户端在线——MiniQMT 须保持登录;xtquant 版本要与客户端匹配。
  • 本机可联网——若策略 / 信号在超级量化云端,本机需能访问外网拉取信号(QMT 本地环境可联网,这点比 PTrade 宽松)。
  • 所谓"本机"也可以是用户自购的 Windows 云主机,只要在那台机器上安装并登录 QMT 客户端即可,这也是无人值守的常见部署方式。
只有 QMT 通道是这个模式;PTrade 无本机对接方式(见 6.3)。

6.3 PTrade 对接方案(只能代码对接)

PTrade 没有任何外部可调用的交易接口,因此超级量化无法像 QMT 那样直接下单。可行做法是代码生成:把策略翻译成符合 PTrade 事件框架的 Python 文件,用户复制进 PTrade 客户端运行;若目标券商的 PTrade 支持外网 HTTP(少数),策略还可在运行时向超级量化拉取因子 / 信号数据,但下单动作仍只能发生在 PTrade 内部。

超级量化 · 生成 PTrade 兼容策略(模板)
# 由超级量化自动生成,用户粘贴进 PTrade 客户端运行
def initialize(context):
    g.codes = ["600570.SS", "600519.SS"]
    set_universe(g.codes)

def handle_data(context, data):
    for code in g.codes:
        target = get_signal_from_superquant(code)   # 仅支持外网的券商可用
        if target is not None:
            order_target_value(code, target)

6.4 推荐架构:一套云端 + 两类执行端

PlantUML diagram
图 13 部署图(对接 · 架构):超级量化云端同时对接 QMT 本地执行器与 PTrade 代码导入
PlantUML diagram
图 14 时序图(对接 · QMT):云端信号经本机执行器转为 QMT 报单并回传成交

落地建议

与合规方案的衔接:本节 QMT 执行器对应《超级量化 · 合规方案》中"用户自持账户 + API key 自跑"的 A 股版本。在大 A 当前只做邮件信号的策略下,QMT 执行器可作为用户本地自跑的选项存在,平台侧仍只提供工具与信号,不介入执行。

6.5 超级量化是 Web 应用,如何落地

Web 应用可以做,但不能是"纯浏览器 + 纯云端 SaaS"。根本原因还是那条硬约束:xtquant 必须与 MiniQMT 客户端同机运行,而浏览器沙箱不能直接执行本地 Python。Web 只能当交互层,用户侧仍必须有一个能跑 xtquant 的本地进程。由此有三种形态:

澄清:"浏览器不能跑本地 Python"是安全策略,不是技术上不可能。浏览器刻意用同源策略 + 沙箱禁止网页任意执行本地进程 / 访问文件系统,以防任意网站 RCE;技术上完全可以,只是必须借道受控桥接且用户安装本地组件:
  • 本地 agent——网页经 localhost HTTP/WebSocket 与本地进程通信(最常用,即下文形态 A);
  • Native Messaging——浏览器扩展经 connectNative 调用已注册的本地宿主程序(需装扩展 + 注册 manifest);
  • 自定义 URL Scheme——myapp:// 唤起本地程序(交互弱、适合跳转不适合实时下单);
  • WebAssembly(如 Pyodide)——能在浏览器沙箱内跑 Python,但访问不到本机 QMT 通道、不能下单,只能做计算 / 回测。
无论走哪种桥,最终都落回"用户侧要有一个原生进程持有 xtquant",结论不变。
形态做法可行性
A. Web 前端 + 本地执行器(agent)云端 Web 照常;用户另装一个轻量本地 agent(跑 xtquant),agent 反向连云端拉信号,或前端经 localhost 直连 agent可行,最常见("网页 + 本地助手")
B. Web 应用私有化部署到用户机器把超级量化整站(含后端)部署到用户本机 / 自购 Windows 云主机,后端进程直接 import xtquant,浏览器只访问本机 Web可行,无人值守友好
C. 纯云端 SaaS + 用户仅浏览器用户侧没有任何进程不可行,无法驱动 QMT
PlantUML diagram
图 15 部署图(对接 · Web 形态):浏览器 + 云端服务 + 用户侧本地执行器(agent)

要点:

6.6 能否"一个账户 / 一个 QMT 服务所有用户"

这是个常见误区。答案分两层:技术上做不到,合规上不允许。

技术层面:权限按账户绑定

QMT / PTrade 的交易权限是绑在具体证券账户上的:xtquant 只能连本机已登录该账户的 MiniQMT,PTrade 策略也只能操作该券商给这个账户开通的权限。一个账户的终端无法合法地替其他用户的账户下单。

合规层面:这属于无牌经营 + 账户归集

第三方平台用一个账户替所有用户交易,等于代客下单 + 资金 / 证券归集,同时触碰多条红线:无牌经营证券业务、账户出借、场外配资、变相资金池,均属违法。

PlantUML diagram
图 16 组件图(合规 · 边界):合法的"持牌机构 + 账户分离" 与非法的"第三方单账户代所有用户"

合法的一对多模式确实存在,但主体是持牌方

模式主体账户是否合法
券商把 PTrade / QMT 提供给全部客户持牌券商每个客户各自的账户合法(账户分离,主体持牌)
私募 / 资管用机构版系统连接多账户持牌私募 / 资管每只产品 / 账户独立合法
软件商把交易系统卖给券商 / 私募软件商(B2B)机构自己的账户合法(卖工具,不碰业务)
第三方用一个账户代所有用户交易无牌第三方账户混同 / 资金池违法
对超级量化的启示:能"一对多"的是持牌主体的系统,不是第三方拿一个账户去服务所有人。超级量化只有两条安全路径——① 让用户自开自持自跑(当前定位);② 把系统 / 工具卖给持牌机构走 B2B。绝不做一个账户代收代下。
专有名词:场外配资 / 账户归集 —— 无资质主体归集他人资金或证券、或出借账户给他人交易,属于非法证券活动。判断的关键不是"用了什么软件",而是资金与账户是否混同、主体是否有牌。

7. 选型建议

你的情况推荐理由
已有云服务器 / 熟悉 Linux,需要第三方库(如 pandas、TA-Lib、自有数据)QMT本地 / 云环境完全自由,可 pip、可外网取数
不想运维服务器,希望策略 7×24 无人值守PTrade托管在机房,客户端关闭后仍运行
策略以 A 股 / 可转债 / ETF 网格为主,逻辑标准化PTrade事件框架 + 内置量化工具足够,且更稳
要做期货多键开平、期权、复杂两融 / 约券QMTxtconstant 对期货 / 期权 / 信用交易覆盖更细
需要极低延迟、贴近柜台的执行PTrade同处券商机房内网,穿透链路更短
两个都想要:研究 / 复杂策略用 QMT,稳定托管用 PTrade组合使用二者不互斥,可按策略类型分配
实操建议:先确认目标券商同时支持哪些终端及开通门槛,再决定。很多券商会同时提供 QMT 与 PTrade,可两个都开通后按上表分工。

8. 实战操作手册

8.1 QMT 从零到实盘

  1. 开户与开通:在支持 QMT 的券商开户,向客户经理申请开通 QMT / MiniQMT 权限,确认资金门槛与佣金。
  2. 安装客户端:下载券商的 QMT / 极速交易终端并安装,登录资金账号,记录安装目录下的 userdata_mini 路径。
  3. 安装 xtquant:在本地 Python 环境放入 / 安装 xtquant 库(须与客户端版本匹配),确认 Python 版本在支持范围内。
  4. 启动并连接:保持 MiniQMT 客户端登录运行;策略进程用 XtQuantTrader(path, session_id) → start() → connect()(返回 0)→ subscribe(acc)。
  5. 行情与回测:用 xtdata.download_history_data 下载历史数据,在本地做回测与因子研究。
  6. 仿真:用模拟账号连接,验证下单、撤单、查询、回调全链路。
  7. 实盘运行:切换到实盘账号,run_forever() 接收主推;建议部署在同网云主机并加进程守护与日志监控。
QMT · 查询账户与持仓
asset = trader.query_stock_asset(acc)
print("可用:", asset.cash, "总资产:", asset.total_asset)

for p in trader.query_stock_positions(acc):
    print(p.stock_code, "持仓:", p.volume, "可用:", p.can_use_volume, "成本:", p.avg_price)

8.2 PTrade 从零到实盘

  1. 开户与开通:在支持 PTrade 的券商开户,向营业部申请 PTrade 权限(部分券商提供测试账号)。
  2. 下载安装:从券商官网下载对应券商的 PTrade 客户端(实盘版 / 测试版),安装并登录。
  3. 新建策略:在策略列表新建策略,选择业务类型(如股票),基于模板编写 initialize + handle_data。
  4. 新建回测:设定起止时间、初始资金、基准与频率(日线 / 分钟),保存后回测,查看收益曲线与评价指标。
  5. 仿真 / 测试:用测试版或模拟客户端验证策略逻辑与下单链路。
  6. 新建交易(托管):在交易界面选中策略、命名并启动,策略即在券商机房按周期运行,可实时查看总资产、持仓与交易日志。
  7. 持久化与监控:跨日状态用全局对象 g 保存(框架自动 pickle),如需可 send_email / send_qywx 推送告警。
PTrade · 读取持仓与账户
def handle_data(context, data):
    pos = context.portfolio.positions          # 持仓字典
    cash = context.portfolio.cash              # 可用资金
    p = get_position("600570.SS")              # 单只持仓
    if p.amount > 0:
        log.info("持仓 %s 股,成本 %.2f" % (p.amount, p.cost_basis))
专有名词:get_research_path() —— PTrade 提供的"研究路径",用于在策略中读写 pickle 文件做持久化,是托管策略跨重启保持状态的标准做法。

9. 参数指令速查手册

9.1 QMT · xtconstant 关键枚举

交易市场 market

含义常量
上交所 / 深交所 / 北交所SH_MARKET / SZ_MARKET / MARKET_ENUM_BEIJING
沪港通 / 深港通MARKET_ENUM_SHANGHAI_HONGKONG_STOCK / MARKET_ENUM_SHENZHEN_HONGKONG_STOCK
上期 / 大商 / 郑商 / 中金 / 能源 / 广期MARKET_ENUM_*_FUTURE
上海 / 深圳期权MARKET_ENUM_SHANGHAI_STOCK_OPTION / MARKET_ENUM_SHENZHEN_STOCK_OPTION

委托类型 order_type(摘)

含义常量
股票买入 / 卖出STOCK_BUY / STOCK_SELL
担保品买 / 卖、融资买入、融券卖出CREDIT_BUY / CREDIT_SELL / CREDIT_FIN_BUY / CREDIT_SLO_SELL
期货开多 / 平昨多 / 平今多 / 开空FUTURE_OPEN_LONG / FUTURE_CLOSE_LONG_HISTORY / FUTURE_CLOSE_LONG_TODAY / FUTURE_OPEN_SHORT
股票期权买开 / 卖平 / 卖开 / 买平STOCK_OPTION_BUY_OPEN / ..._SELL_CLOSE / ..._SELL_OPEN / ..._BUY_CLOSE
ETF 申购 / 赎回ETF_PURCHASE / ETF_REDEMPTION

报价类型 price_type(摘)

含义常量
最新价 / 指定价LATEST_PRICE / FIX_PRICE
沪深股票市价MARKET_SH_CONVERT_5_CANCEL / MARKET_PEER_PRICE_FIRST / MARKET_MINE_PRICE_FIRST
深交所即时成交剩余撤销 / 全额成交或撤销MARKET_SZ_INSTBUSI_RESTCANCEL / MARKET_SZ_FULL_OR_CANCEL

委托状态 order_status

值含义常量
48 / 49 / 50未报 / 待报 / 已报ORDER_UNREPORTED / ORDER_WAIT_REPORTING / ORDER_REPORTED
51 / 52已报待撤 / 部成待撤ORDER_REPORTED_CANCEL / ORDER_PARTSUCC_CANCEL
53 / 54 / 55 / 56部撤 / 已撤 / 部成 / 已成ORDER_PART_CANCEL / ORDER_CANCELED / ORDER_PART_SUCC / ORDER_SUCCEEDED
57废单ORDER_JUNK

核心方法

用途方法
连接 / 订阅connect() / subscribe(acc)
下单(同步 / 异步)order_stock(...) / order_stock_async(...)
撤单cancel_order_stock(acc, order_id) / cancel_order_stock_async(...)
查询query_stock_asset / query_stock_orders / query_stock_trades / query_stock_positions
阻塞接收主推run_forever()

9.2 PTrade · 关键函数与枚举

生命周期函数

函数触发时机
initialize(context)策略启动时执行一次(必选)
before_trading_start(context, data)盘前,每日一次
handle_data(context, data)盘中,按日 / 分钟周期反复执行(必选)
tick_data(context, data) / run_interval(...)tick 级(约 3 秒)盘中处理
after_trading_end(context, data)盘后,每日一次
on_order_response / on_trade_response委托 / 成交主推时触发

设置与定时函数

用途函数
设置股票池 / 基准set_universe / set_benchmark
回测费用与滑点set_commission / set_slippage / set_fixed_slippage
回测成交限制 / 底仓set_volume_ratio / set_limit_mode / set_yesterday_position
定时任务run_daily(func, time='09:30') / run_interval(...)
消息推送send_email / send_qywx

行情与交易函数

类别函数
历史行情get_history / get_price
实时快照 / 盘口get_snapshot / get_gear_price / get_tick_direction
基础信息get_stock_info / get_index_stocks / get_industry_stocks / get_fundamentals
股票下单order / order_target / order_value / order_target_value / order_market
持仓 / 订单查询get_position / get_positions / get_orders / get_open_orders / get_trades
撤单cancel_order / cancel_order_ex
两融margin_trade / margincash_open / margincash_close / marginsec_open / marginsec_close
期货buy_open / sell_close / sell_open / buy_close
指标计算get_MACD / get_KDJ / get_RSI / get_CCI

代码尾缀

市场尾缀(简称 / 全称)
上海证券.SS / .XSHG
深圳证券.SZ / .XSHE
指数.XBHS
中金所期货.CCFX
股票期权.XSHO / .XSZO
对照记忆:下单语义两边可一一对应 —— QMT order_stock(..., STOCK_BUY, vol, FIX_PRICE, price) ≈ PTrade order(secu, vol, limit_price=price);QMT 的"查询"对应 PTrade get_position / get_orders;QMT 回调 on_stock_trade 对应 PTrade on_trade_response。

附录:资料来源

说明:本文技术细节以厂商公开文档为准;资金门槛、佣金、支持品种与接口版本以各券商实际规定为准。